在了解Model、View及Controller的特性之後,接下來就是會遇到在撰寫程式時,常會遇到需要將資料【由Controller傳遞到View】判斷或是【由View回傳資料到Controller】進行處理的情形,就會需要進行資料傳遞。
首先來說明【由Controller傳遞到View】的方式,分為以下幾種:
單Model資料傳遞:只有一組Model資料傳遞。
Controller:將資料表內容利用ViewBag或ViewData方式儲存起來。
public ActionResult DemoModel()
{
ViewBag.students=db.Student.Where(c=>c.classID==1).ToList();
return View();
}
View:宣告變數將ViewBag的內容接收。
<h3>單Model資料傳遞<h3>
<ul>
@foreach(var item in ViewBag.students as List<DemoMVC.Models.Student>){
<li>
@item.name
<li>
}
</ul>
多Model資料傳遞:
Model:新增一ViewModel類別,內容為多資料來源。
public class ClassStudentViewModel
{
public Class class{get;set;}
public IEnumerable<Student> students{get;set;}
}
Controller:宣告該Model並指定內容回傳。
public ActionResult DemoViewModel()
{
ClassStudentViewModel viewmodel = new ClassStudentViewModel();
viewmodel.class = db.Class.ElementAt(1);
viewmodel.students = db.Student.Where(c=>c.classID==1).ToList();
return View(viewmodel);
}
View:宣告Model來源後,可直接引用。
@model DemoApp.Models.ViewModels.ClassStudentViewModel
<h3>@Model.class.name</h3>
<ul>
@foreach(var item in Model.students){
<li>
@item.name
</li>
}
</ul>
Tuple類別:類似Model資料傳遞。
Controller:宣告一組Tuple,指定型態並填入內容。
public ActionResult DemoTuple()
{
var class=db.Class.ElementAt(1);
var students=db.Student.Where(c=>c.classId==1).ToList();
//以下兩者寫法皆可
var tupleModel=new Tuple<Class,List<Student>>(class,students);
//var tupleModel=Tuple.Create(class,students);
return View(tupleModel);
}
View:宣告Model來源後,可直接引用
@using DemoApp.Models;
@model Tuple<Class,List<Student>>
@* Item1 -> Class *@
<h3>@Model.Item1.name</h3>
<ul>
@* Item2 -> List<Student> *@
@foreach(var item in Model.Item2){
<li>
@item.name
</li>
}
</ul>
好的,今天就先到這兒,明天再來繼續吧!
參考來源:
[Asp .Net MVC] Controller and View 2 - 資料傳遞篇